package com.powernode.lambda.listener.func;

// 1. 定义一个函数式接口（Functional Interface）
//    只有一个抽象方法 => 可以用 Lambda 表达式实现
@FunctionalInterface
interface PageListener {
    // 当某一页生成结束时调用
    void onPageEnd(int pageNum);
}

// 2. 定义一个文档生成器（模拟 PDF 生成过程中的事件触发）
class DocumentGenerator {
    // 用于保存用户传入的监听器回调
    private PageListener pageListener;

    // 3. 提供一个方法，让用户设置监听器（可以是 Lambda 表达式）
    public void setPageListener(PageListener listener) {
        this.pageListener = listener;
    }

    // 4. 模拟文档生成过程（比如生成 3 页内容）
    public void generate() {
        System.out.println("🚀 开始生成文档...");

        int totalPages = 3;

        for (int pageNum = 1; pageNum <= totalPages; pageNum++) {
            // 模拟：生成当前页内容
            System.out.println("   🔹 正在生成第 " + pageNum + " 页的内容...");
            
            // 模拟耗时操作
            try {
                Thread.sleep(600); // 暂停 600ms 模拟生成过程
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 5. 关键：第 pageNum 页生成完毕，自动调用监听器回调
            if (pageListener != null) {
                System.out.println("   📢 [系统] 第 " + pageNum + " 页生成完毕，通知监听器...");
                pageListener.onPageEnd(pageNum); // ✅ 自动调用！您传入的是 Lambda，这里就是您的逻辑被触发！
            }
        }

        System.out.println("✅ 文档生成完毕，共 " + totalPages + " 页。");
    }
}

// 3. 主类：测试函数式接口 + Lambda 的回调机制
public class FunctionalListenerDemo {
    public static void main(String[] args) {
        // 创建一个文档生成器
        DocumentGenerator docGen = new DocumentGenerator();

        // ✅ 关键：使用 Lambda 表达式 设置监听器（替代原来的 MyPageListener 类）
        // 您的回调逻辑，就写在 Lambda 里面 👇
        docGen.setPageListener(pageNum -> {
            System.out.println("🎨 [Lambda 监听器] 收到通知：第 " + pageNum + " 页已完成！");
            System.out.println("   → 我可以在这里自动添加页脚，比如：「第 " + pageNum + " 页，共 3 页」");
            System.out.println("   → 或者添加水印、盖章、统计信息等...\n");
        });

        // 4. 开始生成文档（会自动在每页结束时调用您上面写的 Lambda 逻辑！）
        docGen.generate();
    }
}